<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <meta name="author" content="隐星魂 (Roy.Sun)">
        
        <link rel="shortcut icon" href="../../img/favicon.ico">
        <title>系统基本架构 - 玄武操作系统</title>
        <link href="../../css/bootstrap.min.css" rel="stylesheet">
        <link href="../../css/font-awesome.min.css" rel="stylesheet">
        <link href="../../css/base.css" rel="stylesheet">
        <link rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.3/styles/color-brewer.min.css">

        <script src="../../js/jquery-1.10.2.min.js" defer></script>
        <script src="../../js/bootstrap.min.js" defer></script>
        <script src="https://cdn.staticfile.org/highlight.js/10.0.3/highlight.min.js"></script>
        <script>hljs.initHighlightingOnLoad();</script> 
    </head>

    <body>
        <div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
            <div class="container">
                <a class="navbar-brand" href="../..">玄武操作系统</a>
                <!-- Expander button -->
                <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbar-collapse">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <!-- Expanded navigation -->
                <div id="navbar-collapse" class="navbar-collapse collapse">
                        <!-- Main navigation -->
                        <ul class="nav navbar-nav">
                            <li class="navitem">
                                <a href="../.." class="nav-link">介绍</a>
                            </li>
                            <li class="navitem">
                                <a href="../../license/" class="nav-link">开源协议</a>
                            </li>
                            <li class="dropdown active">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">应用手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../01.%E7%AE%80%E4%BB%8B/" class="dropdown-item">简介</a>
</li>
                                    
<li>
    <a href="./" class="dropdown-item active">系统基本架构</a>
</li>
                                    
<li>
    <a href="../03.%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F/" class="dropdown-item">构建系统</a>
</li>
                                    
<li>
    <a href="../04.%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B/" class="dropdown-item">启动流程</a>
</li>
                                    
<li>
    <a href="../05.%E5%9F%BA%E6%9C%AC%E7%BA%A6%E5%AE%9A/" class="dropdown-item">基本约定</a>
</li>
                                    
<li>
    <a href="../06.%E4%B8%AD%E6%96%AD%E6%8E%A7%E5%88%B6/" class="dropdown-item">中断控制</a>
</li>
                                    
<li>
    <a href="../07.%E8%B0%83%E5%BA%A6%E5%99%A8/" class="dropdown-item">调度器</a>
</li>
                                    
<li>
    <a href="../08.%E7%BA%BF%E7%A8%8B/" class="dropdown-item">线程</a>
</li>
                                    
<li>
    <a href="../09.%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86/" class="dropdown-item">电源管理</a>
</li>
                                    
<li>
    <a href="../10.%E8%BD%AF%E4%BB%B6%E5%AE%9A%E6%97%B6%E5%99%A8/" class="dropdown-item">软件定时器</a>
</li>
                                    
<li>
    <a href="../11.%E9%94%81/" class="dropdown-item">锁</a>
</li>
                                    
<li>
    <a href="../12.%E5%90%8C%E6%AD%A5/" class="dropdown-item">同步</a>
</li>
                                    
<li>
    <a href="../13.%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/" class="dropdown-item">内存管理</a>
</li>
                                    
<li>
    <a href="../14.%E7%8E%84%E6%AD%A6C%E5%BA%93/" class="dropdown-item">玄武C库</a>
</li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">快速开发指南 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">S32k</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/s32k/1.XuanWuOS-envsetup-guide/" class="dropdown-item">开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/s32k/2.XuanWuOS-project-setup-guide/" class="dropdown-item">工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">Stm32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/stm32/1.XuanWuOS-envsetup-guide/" class="dropdown-item">开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/stm32/2.XuanWuOS-project-setup-guide/" class="dropdown-item">工程配置指南</a>
</li>
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/stm32/3.XuanWuOS-xwbd-atkh743/" class="dropdown-item">正点原子阿波罗H743开发板上手指南</a>
</li>
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/stm32/4.XuanWuOS-xwbd-fk429m/" class="dropdown-item">反客F429核心板上手指南</a>
</li>
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/stm32/5.XuanWuOS-xwbd-atkf407core/" class="dropdown-item">正点原子F407核心板上手指南</a>
</li>
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/stm32/6.XuanWuOS-xwbd-atkf103core/" class="dropdown-item">正点原子F103核心板上手指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">Xwko</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../%E5%BF%AB%E9%80%9F%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/xwko/1.XuanWuKO-guide/" class="dropdown-item">玄武内核模块快速上手指南</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">规范 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../%E8%A7%84%E8%8C%83/git-commit-specification/" class="dropdown-item">git commit规范</a>
</li>
                                    
<li>
    <a href="../../%E8%A7%84%E8%8C%83/version-branch-specification/" class="dropdown-item">分支与版本号</a>
</li>
                                </ul>
                            </li>
                        </ul>

                    <ul class="nav navbar-nav ml-auto">
                        <li class="nav-item">
                            <a href="#" class="nav-link" data-toggle="modal" data-target="#mkdocs_search_modal">
                                <i class="fa fa-search"></i> 搜索
                            </a>
                        </li>
                            <li class="nav-item">
                                <a rel="prev" href="../01.%E7%AE%80%E4%BB%8B/" class="nav-link">
                                    <i class="fa fa-arrow-left"></i> 上一篇
                                </a>
                            </li>
                            <li class="nav-item">
                                <a rel="next" href="../03.%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F/" class="nav-link">
                                    下一篇 <i class="fa fa-arrow-right"></i>
                                </a>
                            </li>
                    </ul>
                </div>
            </div>
        </div>

        <div class="container">
            <div class="row">
                    <div class="col-md-3"><div class="navbar-light navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
    <div class="navbar-header">
        <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#toc-collapse" title="Table of Contents">
            <span class="fa fa-angle-down"></span>
        </button>
    </div>

    
    <div id="toc-collapse" class="navbar-collapse collapse card bg-secondary">
        <ul class="nav flex-column">
            
            <li class="nav-item" data-level="1"><a href="#_1" class="nav-link">系统基本架构</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#_2" class="nav-link">概述</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#_3" class="nav-link">软件架构与配置</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#_5" class="nav-link">配置说明</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
        </ul>
    </div>
</div></div>
                    <div class="col-md-9" role="main">

<h1 id="_1">系统基本架构</h1>
<h2 id="_2">概述</h2>
<p>玄武OS在设计时就充分考虑了代码的复用性和移植性，代码被架构成多层结构：
BSP层、内核层、中间件层和应用层。</p>
<p><img alt="img" src="../res/figure/xwos-arch.png" title="玄武OS架构图" /></p>
<ul>
<li>编译系统；</li>
<li>板级支持层(BSP Layer)：<ul>
<li>处理器架构/CPU/SOC/外设芯片相关的代码；</li>
<li>电路板相关的源代码以及项目相关的配置。</li>
</ul>
</li>
<li>操作系统层(OS Layer)：<ul>
<li>内核：<ul>
<li>C函数库：原子操作库、位操作库、数据结构等；</li>
<li>调度器：单核、多核、线程调度、定时器；</li>
<li>同步：信号量、条件量；</li>
<li>锁：自旋锁、顺序锁、互斥锁；</li>
<li>内存管理：简单内存分配器、内存切片算法、伙伴算法、内存池。</li>
</ul>
</li>
</ul>
</li>
<li>中间件层(Middleware Layer)：驱动/中间件/第三方开源组件；</li>
<li>应用层(Application Layer)。</li>
</ul>
<h2 id="_3">软件架构与配置</h2>
<h3 id="_4">描述</h3>
<p>玄武OS每一层软件都有独立的配置文件，所有配置文件都集中存放于
<strong>xwbd/电路板名称/cfg</strong> 文件夹中。</p>
<ul>
<li>编译系统：<ul>
<li>配置文件： <strong>cfg/XuanWuOS.h</strong><ul>
<li>配置文件是用C头文件来编写的，这是为了和其他配置文件保持一致，
    但是其中定义的“宏”会被转换成Makefile的变量来使用。
    详细可参考&lt;构建系统.md&gt;。</li>
<li>配置中的架构、CPU、SOC型号、电路板等信息用于确定编译时各层代码的路径。</li>
<li>详细注释可参考<a href="#org733566d">配置说明</a>。</li>
</ul>
</li>
<li>源码路径： <strong>xwbs</strong><ul>
<li>编译系统主要是用Makefile的语法进行编写，但也会使用一些其他脚本语言
    来实现一些小功能，例如Shell、Emacs-Lisp、Python等。</li>
</ul>
</li>
</ul>
</li>
<li>BSP层：<ul>
<li>处理器架构描述层(ADL)<ul>
<li>配置文件： <strong>cfg/arch.h</strong></li>
<li>源码路径： <strong>xwcd/soc/架构/子架构/编译器</strong></li>
<li>通常移植同架构的不同单片机只需调整配置，不必修改处理器架构描述层
    的源代码。例如，同为ARMv7架构的单片机STM32F1、STM32F4和S32K
    就复用了 <strong>xwcd/soc/arm/v7m/gcc</strong> 中的代码，不同的地方再通过配置进行调整。</li>
<li>处理器架构描述层会提供与编译器相关的修饰限定词。因为这些特性通常与
    处理器架构、控制编译/连接方式有关，ANSI-C不能表达这些内容。</li>
<li>处理器架构描述层通常会在汇编层面，使用一些特殊指令提供基本的C函数库，
    例如，原子操作库、位操作库、自旋锁，可充分挖掘架构的潜能。</li>
<li>处理器架构描述层也会提供一些共有硬件资源的驱动，例如ARMv7架构的单片机，
    无论是哪个芯片厂家的型号，都有ARM公司官方文档中定义的NVIC、Systick等
    硬件资源。</li>
</ul>
</li>
<li>处理器集合描述层(CDL)<ul>
<li>配置文件： <strong>cfg/cpu.h</strong></li>
<li>源码路径： ADL目录下的CPU子集目录</li>
<li>这一层是对处理器架构描述层的进一步细分和补充。通常大的处理器架构下面
    又有细分为几个CPU子集，例如ARMv7又有m3、m4和m7的区分。这一层主要是描述
    这种细微的差异，代码很少，例如ARMv7的m4和m3的区别仅仅是m4的cpu.mk中
    增加了编译选项 <strong>-mfloat-abi=hard -mfpu=fpv4-sp-d16</strong> ，表示m4的内核是
    有硬件浮点数单元的，编译浮点运算的源代码时会直接生成硬件浮点指令，而
    不会使用编译器提供的软件模拟的方式。</li>
</ul>
</li>
<li>片上系统描述层(SDL)<ul>
<li>配置文件： <strong>cfg/soc.h</strong></li>
<li>源码路径： CDL目录下的SOC子集目录</li>
<li>玄武OS内核所需要的BSP层的适配代码就由这一层来提供，包括中断控制器、
    系统滴答时钟、切换上下文的中断等。</li>
<li>也可在这一层提供SOC中各种硬件资源的驱动代码。</li>
</ul>
</li>
<li>板级描述层(BDL)<ul>
<li>配置文件： <strong>cfg/board.h</strong></li>
<li>源码路径： <strong>xwbd/电路板名称/bdl</strong></li>
<li>配置时钟；</li>
<li>初始化内存管理；</li>
<li>提供用户程序的总入口： <strong>xwos_main()</strong></li>
</ul>
</li>
<li>板级模块(BM)中的驱动<ul>
<li>配置文件： <strong>cfg/board.h</strong></li>
<li>源码路径： <strong>xwbd/电路板名称/bm</strong></li>
<li>需要使用第三方的驱动库时通常采用&lt;03.构建系统.md&gt;的方式
    进行集成，这是因为玄武模块在玄武OS的编译系统中会编译成独立的静态库，
    可保持其独立性，降低与整个系统的耦合性，也方便增加一些wrapper代码进行封装。
    例如STM32CubeMX生成的驱动代码就是通过板级模块的方式集成的。</li>
</ul>
</li>
<li>外设驱动<ul>
<li>配置文件： <strong>cfg/perpheral.h</strong></li>
<li>源码路径： <strong>xwcd/perpheral</strong></li>
<li>一些常见的外设芯片驱动放在此处，这些外设芯片的驱动也是采用
    &lt;03.构建系统.md&gt;的方式进行集成，方便通过配置筛选驱动。</li>
</ul>
</li>
</ul>
</li>
<li>操作系统层<ul>
<li>内核<ul>
<li>配置文件： <strong>cfg/xwos.h</strong></li>
<li>源码路径： <strong>xwos</strong></li>
</ul>
</li>
</ul>
</li>
<li>中间件层<ul>
<li>玄武OS自身提供的中间件<ul>
<li>配置文件： <strong>cfg/xwmd.h</strong></li>
<li>源码路径： <strong>xwmd</strong></li>
</ul>
</li>
<li>第三方组件<ul>
<li>配置文件： <strong>cfg/xwem.h</strong></li>
<li>源码路径： <strong>xwem</strong></li>
</ul>
</li>
</ul>
</li>
<li>应用层：<ul>
<li>应用可放在板级模块(bm)中<ul>
<li>配置文件： <strong>cfg/board.h</strong></li>
<li>源码路径： <strong>xwbd/电路板名称/bm</strong></li>
</ul>
</li>
<li>应用可放在 <strong>xwam</strong> 中<ul>
<li>配置文件： <strong>cfg/xwam.h</strong></li>
<li>源码路径： <strong>xwam</strong></li>
</ul>
</li>
</ul>
</li>
</ul>
<p><a id="org733566d"></a></p>
<h2 id="_5">配置说明</h2>
<p>玄武OS在设计之初曾考虑过使用现成的配置生成工具，例如Linux内核的Kconfig工具。
但为了降低跨平台开发的工作量和难度，作者最终选择使用C语言的头文件来描述所有配置，
即便这些配置中很一部分是给编译系统使用的（例如路径的配置）。</p>
<h3 id="cfgxuanwuosh">cfg/XuanWuOS.h</h3>
<pre><code class="C">#ifndef __cfg_XuanWuOS_h__
#define __cfg_XuanWuOS_h__

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********  ARCH &amp; compiler  ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_ARCH       arm // 架构：在xwcd/soc中选择架构文件夹
#define XuanWuOS_CFG_SUBARCH    v7m // 子架构：在架构文件夹中选择子架构文件夹
#define XuanWuOS_CFG_COMPILER   gcc // 编译器：在子架构文件夹中选择编译器文件夹
#define XuanWuOS_CFG_LDSCRIPT   cfg/XuanWuOS.lds // 脚本的的相对路径，
                                                 // 相对于电路板目录：
                                                 // xwbd/电路板名称
#define XuanWuOS_CFG_MK_RULE    arm-cortex-m.gcc.rule // 选择xwbs文件夹中的
                                                      // makefile规则
#define XuanWuOS_CFG_ELF_MK     arm-cortex-m.gcc.mk // 选择xwbs文件夹中编译ELF
                                                    // 的makefile
#define XuanWuOS_CFG_XWMO_MK    arm-cortex-m.gcc.xwmo.mk // 选择xwbs文件夹中编译
                                                         // 玄武模块的makefile

#include &lt;cfg/arch.h&gt; // 包含架构的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********        CPU        ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_CPU        m4 // CPU集合：在编译器文件夹中选择CPU集合文件夹
#include &lt;cfg/cpu.h&gt; // 包含CPU集合的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********        SOC        ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_SOC        stm32f4x // 芯片：在CPU集合文件夹中选择芯片文件夹
#include &lt;cfg/soc.h&gt; // 包含SOC芯片的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********     perpheral     ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_PERPHERAL  1 // 是否需要引用外设库，取值：1|0
#include &lt;cfg/perpheral.h&gt; // 包含外设库的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********       board       ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_BOARD      fk429m // 电路板或项目的名字，
                                       // 选在位于xwbd文件夹下的电路板目录
#include &lt;cfg/board.h&gt; // 包含电路板的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********    XWOS kernel    ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_CORE       smp // 内核的类型，取值：smp|up
                                    // + smp: 对称多核
                                    // + up: 单核
#include &lt;cfg/xwos.h&gt; // 包含内核的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********  XWOS middleware  ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_XWMD       1 // 是否需要引用中间件库，取值：1|0
#include &lt;cfg/xwmd.h&gt; // 包含中间件的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********  external module  ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_XWEM       1 // 是否需要引用第三方组件库，取值：1|0
#include &lt;cfg/xwem.h&gt; // 包含第三方组件库的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********     APP module    ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_XWAM       1 // 是否需要引用应用组件库，取值：1|0
#include &lt;cfg/xwam.h&gt; // 包含应用组件库的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ******** ********     OEM module    ******** ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#define XuanWuOS_CFG_OEMPATH    ../oem // OEM模块的搜索路径
                                       // + 如果为相对路径，则
                                       //   相对于玄武OS的根目录
                                       // + 可以为绝对路径
#include &lt;cfg/oem.h&gt; // 包含OEM模块的配置，此头文件路径相对于电路板目录

/******** ******** ******** ******** ******** ******** ******** ********
 ******** ********        auto-generated header        ******** ********
 ******** ******** ******** ******** ******** ******** ******** ********/
#include &lt;wkspc/autogen.h&gt; // 此头文件中部分配置的定义不符合C的语法，不可在
                           // 其他C代码中引用，因此配置生成工具会生成一份
                           // 新的头文件，此头文件路径相对于电路板目录，
                           // 包括部分配置可在其他C代码中引用的宏定义。

#endif /* cfg/XuanWuOS.h */
</code></pre></div>
            </div>
        </div>

        <footer class="col-md-12">
            <hr>
            <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
        </footer>
        <script>
            var base_url = "../..",
                shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
        </script>
        <script src="../../js/base.js" defer></script>
        <script src="../../search/main.js" defer></script>

        <div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="searchModalLabel">搜索</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
                <p>
                    在这里所有文档：
                </p>
                <form>
                    <div class="form-group">
                        <input type="search" class="form-control" placeholder="搜索..." id="mkdocs-search-query" title="Type search term here">
                    </div>
                </form>
                <div id="mkdocs-search-results"></div>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
              <table class="table">
                <thead>
                  <tr>
                    <th style="width: 20%;">Keys</th>
                    <th>Action</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td class="help shortcut"><kbd>?</kbd></td>
                    <td>Open this help</td>
                  </tr>
                  <tr>
                    <td class="next shortcut"><kbd>n</kbd></td>
                    <td>Next page</td>
                  </tr>
                  <tr>
                    <td class="prev shortcut"><kbd>p</kbd></td>
                    <td>Previous page</td>
                  </tr>
                  <tr>
                    <td class="search shortcut"><kbd>s</kbd></td>
                    <td>Search</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>

    </body>
</html>
